#pragma comment(linker, "/subsystem:windows /entry:wmainCRTStartup")

int updatewmain(int argc, wchar_t *argv[])
{
    if (argc <= 1)
        return 0;
    SetProcessDPIAware();
    AutoHandle hMutex = CreateMutex(NULL, FALSE, L"LUNA_UPDATER_SINGLE");

    if (GetLastError() == ERROR_ALREADY_EXISTS)
        return 0;
    while (true)
    {
        AutoHandle semaphore = CreateMutex(NULL, FALSE, L"LUNA_UPDATER_BLOCK");
        if (GetLastError() != ERROR_ALREADY_EXISTS)
            break;
        Sleep(1000);
    }
    WCHAR path[MAX_PATH];
    GetModuleFileNameW(GetModuleHandle(0), path, MAX_PATH);

    *(wcsrchr(path, '\\')) = 0;
    *(wcsrchr(path, '\\')) = 0;

    SetCurrentDirectory(path);
    try
    {
        std::filesystem::copy(argv[1], L".\\", std::filesystem::copy_options::recursive | std::filesystem::copy_options::overwrite_existing);
        MessageBoxW(GetForegroundWindow(), L"Update success", L"Success", 0);
    }
    catch (std::exception &e)
    {
        MessageBoxA(GetForegroundWindow(), (std::string("Update failed!\r\n") + e.what()).c_str(), "Error", 0);
        ShellExecute(0, L"open", L"https://lunatranslator.xyz/Github/LunaTranslator/releases", NULL, NULL, SW_SHOWNORMAL);
        return 0;
    }
    try
    {
        wcscat(path, L"\\cache\\update");
        std::filesystem::remove_all(path);
    }
    catch (std::exception &e)
    {
    }
    return 0;
}